/**
 * Software License, Version 1.0
 *
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 *
 *
 *Redistribution and use in source and binary forms, with or without
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For
 * further information contact the Community Grids Lab at
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and
 * wherever such third-party acknowledgments normally appear.
 *
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering,
 * shall not be used to endorse or promote products derived from this software
 * without prior written permission from Indiana University.  For written
 * permission, please contact the Advanced Research and Technology Institute
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering,
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 *
 *
 * Indiana University provides no reassurances that the source code provided
 * does not infringe the patent or any other intellectual property rights of
 * any other entity.  Indiana University disclaims any liability to any
 * recipient for claims brought by any other entity based on infringement of
 * intellectual property rights or otherwise.
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS.
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS",
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.sync;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * This class encapsulates a SyncDatagram. See rfc2030 for more details.
 * @author Hasan Bulut - hbulut@indiana.edu
 */
public class SyncServerDatagramPacket {
    //~ Instance fields ----------------------------------------------------------

    private DatagramSocket serverSyncPacket;
    private SyncTimestamp receiveTimeStamp = new SyncTimestamp();
    private SyncTimestamp transmitTimeStamp = new SyncTimestamp();
    private int LENGTH = 8;
    private byte[] buffer; //small buffer used to receive packet
    private SyncDatagramPacket syncPacket;
    private DatagramPacket receivePacket;//packet to be received

    //~ Constructors -------------------------------------------------------------
    /**
     * Constructs a SyncDatagram with only the transmit timestamp
     * filled in (set to the current time).
     * Must be small to be rapidly executed.
     * @param header SyncHeader
     * @param iaddr InetAddress - InetAddress of the server
     * @param iport int - port number of the server
     */
    public SyncServerDatagramPacket(int iport) throws SocketException {
        serverSyncPacket = new DatagramSocket(iport);
    }

    /*Receives a packet Marks timestamps and sends them back*/
    public void receiveRequest() {

        buffer = new byte[LENGTH];
        try {
            //Receive Timestamp
            receivePacket = new DatagramPacket(buffer, buffer.length);//creates new packet to hold data
            serverSyncPacket.receive(receivePacket);//waits the packet on the network
            receiveTimeStamp = new SyncTimestamp();//gets the time right after the packet was received.
            receivePacket.setData(receiveTimeStamp.getTimestampData());//saves the timestamp inside the packet.
            serverSyncPacket.send(receivePacket);//Sends the timestamp back to the requester.

            //Transmit Timestamp
            transmitTimeStamp = new SyncTimestamp();//Gets the timestamp right after the packet was sent
            receivePacket.setData(transmitTimeStamp.getTimestampData());//Saves the timestamp inside the packet
            serverSyncPacket.send(receivePacket);//Sends the packet back to the requester
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public synchronized void stopListening() {
        serverSyncPacket.close();//verifies inf synchronized is needed here
    }
    //~ Methods ------------------------------------------------------------------

    /**
     * Gets the receive timestamp.
     * @return SyncTimestamp
     */
    public SyncTimestamp getReceiveTimeStamp() {
        return receiveTimeStamp;
    }

    /**
     * Gets the transmit timestamp.
     * @return SyncTimestamp
     */
    public SyncTimestamp getTransmitTimeStamp() {
        return transmitTimeStamp;
    }

    /**
     * Gets SyncDatagramPacket in String format. String includes the followings:
     * Header, ReferenceTimeStamp, OriginateTimeStamp, ReceiveTimeStamp, TransmitTimeStamp
     * @return String - String representation of SyncDatagramPacket
     */
    public String toString() {
        String s;

        s = "ReceiveTimeStamp : ";
        s = s + getReceiveTimeStamp();
        s = s + "\n";
        s = s + "TransmitTimeStamp : ";
        s = s + getTransmitTimeStamp();

        return s;
    }
    // public static void main(String a[]){
    //    SyncServerDatagramPacket sndp = new SyncServerDatagramPacket(1123);
    //     while(true){
    //    	sndp.receiveRequest();
    //    }
    // }
}
